/**
 * Created with IntelliJ IDEA.
 * Description:饿汉模式实现单例模式
 * User: 邓大帅
 * Date: 2024-01-25
 * Time: 13:26
 */
class SingletonLazy {
    volatile private static SingletonLazy instance = null;
    public static SingletonLazy getInstance() {
//        这里如果不加锁，会有线程安全问题，可能会导致多个线程都new对象，有些单例实例所占内存十分巨大，若是多new可能会导致内存空间不足，系统崩溃
//        外层if用于判定是否要加锁，如果对象已经有了，就不必加锁了，此时本身就是线程安全的，只有在第一次new的时候代码才是线程不安全的
        if (instance == null) {
            synchronized (SingletonLazy.class) {
                if (instance == null) {
//                    new对象时有三步：1.申请内存空间 2.初始化对象 3.将对象的地址赋值给引用 这里会发生指令重排序，需要声明instance时用volatile修饰，这样不会发生指令重排序
                    instance = new SingletonLazy();
                }
            }
        }
        return instance;
    }
    private SingletonLazy() {}
}
public class ThreadDemo1 {
    public static void main(String[] args) {
        SingletonLazy s1 = SingletonLazy.getInstance();
        SingletonLazy s2 = SingletonLazy.getInstance();
        System.out.println(s1 == s2);
    }
}
